package com.example.designpatterns.proxy;

import com.example.designpatterns.proxy.protection.ImageOwner;
import com.example.designpatterns.proxy.protection.ProtectedImage;
import com.example.designpatterns.proxy.protection.User;

/**
 * 代理模式演示类
 */
public class ProxyPatternDemo {
    public static void main(String[] args) {
        System.out.println("===== 代理模式演示 =====\n");
        
        // 演示虚拟代理（懒加载）
        demonstrateVirtualProxy();
        
        System.out.println("\n===== 分隔线 =====\n");
        
        // 演示保护代理（访问控制）
        demonstrateProtectionProxy();
    }
    
    /**
     * 演示虚拟代理的使用（懒加载）
     */
    private static void demonstrateVirtualProxy() {
        System.out.println("===== 虚拟代理演示 =====");
        System.out.println("虚拟代理实现延迟加载，直到真正需要访问资源时才加载真实对象\n");
        
        // 创建多个图像代理，但不会立即加载实际图像
        System.out.println("1. 创建多个图像代理");
        ProxyImage image1 = new ProxyImage("高清风景照片.jpg");
        ProxyImage image2 = new ProxyImage("产品目录.png");
        ProxyImage image3 = new ProxyImage("用户手册.pdf");
        
        System.out.println("\n图像代理已创建，但尚未加载实际图像\n");
        
        // 访问图像元数据不会触发加载
        System.out.println("2. 访问图像元数据（不会触发加载）");
        System.out.println("图像1文件名: " + image1.getFilename() + ", 预估大小: " + image1.getSize() + " KB");
        System.out.println("图像2文件名: " + image2.getFilename() + ", 预估大小: " + image2.getSize() + " KB");
        System.out.println("图像3文件名: " + image3.getFilename() + ", 预估大小: " + image3.getSize() + " KB");
        
        System.out.println("\n检查图像是否已加载：");
        System.out.println("图像1已加载: " + image1.isImageLoaded());
        System.out.println("图像2已加载: " + image2.isImageLoaded());
        System.out.println("图像3已加载: " + image3.isImageLoaded());
        
        // 显示图像时才会触发加载
        System.out.println("\n3. 显示图像（触发实际图像加载）");
        System.out.println("\n显示图像1:");
        image1.display();
        
        System.out.println("\n再次检查加载状态：");
        System.out.println("图像1已加载: " + image1.isImageLoaded());
        System.out.println("图像2已加载: " + image2.isImageLoaded());
        System.out.println("图像3已加载: " + image3.isImageLoaded());
        
        // 再次显示已加载的图像不会重新加载
        System.out.println("\n4. 再次显示已加载的图像（不会重新加载）");
        System.out.println("\n再次显示图像1:");
        image1.display();
    }
    
    /**
     * 演示保护代理的使用（访问控制）
     */
    private static void demonstrateProtectionProxy() {
        System.out.println("===== 保护代理演示 =====");
        System.out.println("保护代理控制对资源的访问权限\n");
        
        // 创建用户
        User owner = new User("张三", false);
        User admin = new User("管理员", true);
        User otherUser = new User("李四", false);
        
        // 创建受保护的图像
        System.out.println("1. 创建受保护的图像");
        ProtectedImage protectedImage = new ProtectedImage("私人照片.jpg", owner);
        
        System.out.println("\n2. 显示图像（任何人都可以查看）");
        protectedImage.display();
        
        // 测试图像修改权限
        System.out.println("\n3. 测试图像修改权限");
        
        // 所有者可以修改图像
        System.out.println("\n所有者尝试修改图像：");
        protectedImage.modifyImage(owner, "新的私人照片.jpg");
        
        // 管理员可以修改图像
        System.out.println("\n管理员尝试修改图像：");
        protectedImage.modifyImage(admin, "管理员修改的照片.jpg");
        
        // 其他用户无法修改图像
        System.out.println("\n其他用户尝试修改图像：");
        protectedImage.modifyImage(otherUser, "尝试篡改的照片.jpg");
        
        // 显示最终图像名称
        System.out.println("\n4. 最终图像信息");
        System.out.println("文件名: " + protectedImage.getFilename());
        System.out.println("所有者: " + protectedImage.getOwner().getUsername());
    }
} 